# 课本第二章自习部分:
# author: 贺雪
# week05:课本第二章自学：数据结构之列表

# 列表：有序的可变数据结构
# 元组：有序的不可变数据结构
# 字典：无序的数据结构
# 集合：避免重复的数据结构

# 字面列表
prices = []
# 浮点数列表
temps = [32.0, 212.0, 0.0, 81.6, 100.0, 45.3]
# 字符串对象列表
words = ['hello', 'world']
# 含列表对象的列表
everything = [prices, temps, words]
# 使用列表
vowels = ['a', 'e', 'i', 'o', 'u']
word = "milliways"
for letter in word:
    if letter in vowels:
        print(letter)

found = []
# len 内置函数：报告一个对象的大小
len(found)

# append:向现有列表增加单个对象
found.append('a')
len(found)
found

found.append('e')
found.append('i')
found.append('o')
len(found)
found

if 'u' not in found:
    found.append('u')
found

vowels = ['a', 'e', 'i', 'o', 'u']
word = input("provide a word to search for vowels:")
found = []
for letter in word:
    if letter in vowels:
        if letter not in found:
            found.append(letter)
for vowel in found:
    print(vowel)

# remove方法：取一个对象值作为唯一参数
# 删除指定数据值的第一次出现(列表大小减1)
nums = [1, 2, 3, 4]
nums
# pop方法，从特定索引槽删除和返回同一个对象
# 若无指定索引值，则删除最后一个对象
nums.pop()
nums
# 0对应第一个对象
nums.pop(0)
nums
#用对象扩展列表
# extend方法：接收第二个列表，将各个对象增加到现有列表(末端)
nums.extend([3,4])
# insert 在列表开头或任何位置(除了末端）增加对象
nums.insert(0,1)
# 0作为索引，1是插入的对象
nums
nums.insert(2,'two-and-a-half')
nums

phrase = "Don't panic!"
# 将字符串转换为列表
plist = list(phrase)
print(phrase)
print(plist)
# for循环迭代，pop删除最后4个对象剩Don't pa
for i in range(4):
    plist.pop()
# 用pop删除第一个对象D剩on't pa
plist.pop(0)
# 用remove删除对象‘剩ont pa
plist.remove("'")
#弹出列表最后两个对象：a,p；增加对象扩展列表为ont ap
plist.extend([plist.pop(),plist.pop()])
# 用pop弹出空格，用insert插入第二个对象后
plist.insert(2,plist.pop(3))
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)
# 知识点:
# 列表可用于存储相关对象的集合
# Python的列表可以根据需要动态收缩和扩展
# 代码中，对象列表用中括号包围，列表对象相互间用逗号分开；
# 空列表表示为[]
# 用Python的in操作符可检查成员关系
# 列表方法：append，extend，insert使Python可在运行时扩展列表
# remove，pop方法，可使Python在运行时收缩列表

# 复制中，若变量引用现有列表，可使用操作符=
# 若为初始化一个新列表，则需使用copy方法
first = [1,2,3,4,5]
first
second =first
second

second.append(6)
second
first

# 使用copy复制数据结构
third = second.copy()
third

third.append(7)
third
second

# Python允许相对于列表两端来访问列表，正索引值从左向右数，负索引值从右向左数
saying = "don't panic!"
letters = list(saying)
letters

letters[0]
letters[3]
letters[5]
letters[-3]
letters[-6]

# 在列表中运用开始，结束和步长值
# 无指定开始值，则默认为0
# 无指定结束值，则取列表允许的最大值
# 无指定步长值，则默认值为1
letters[start:stop:step]

# 列表切片的使用
letters
letters[0:10:3]
letters[3:]
letters[:10]
letters[::2]

# 开始和结束列表
#''.join
book = "the hitchhiker's guide to the galaxy"
booklist = list(book)
booklist
booklist[0:3]
''.join(booklist[0:3])
''.join(booklist[-6:])
# 列表中使用步长值
backwards = booklist[::-1]
''.join(backwards)
#返回的数据称为一个切片
every_other = booklist[::2]
''.join(every_other)
''.join(booklist[4:14])
''.join(booklist[13:3:-1])

# 在列表中使用切片、中括号记法（不会改变列表状态）
phrase = "don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
# 命名新列表，在列表中取出on
new_phrase = ''.join(plist[1:3])
#加入空格。t.p.a.
new_phrase = new_phrase + ''.join([plist[5],plist[4],plist[7],plist[6]])
print(plist)
print(new_phrase)

# 在列表中使用for 循环
# 给变量赋字符串
paranoid_android = 'Marvin'
# 转换为字符对象列表
letters = list(paranoid_android)
# 迭代时，char指示当前对象，letters为迭代处理的列表
for char in letters:
    # \t为制表符
    print('\t',char)

paranoid_android = "marvin,the paranoid android"
letters = list(paranoid_android)
# 第一个循环迭代处理列表中能够前6个对象的切片
for char in letters[:6]:
    print('\t',char)
print()
# 第二个循环迭代处理列表中后7个对象的切片；*2会在每个对象前插入2个制表符
for char in letters[-7:]:
    print('\t'*2,char)
print()
# 第三个循环迭代处理列表中的最后一个切片；*3插入3个制表符
for char in letters[12:20]:
    print('\t'*3,char)

# 知识点：
# 列表中可以用中括号记法任何列表选择单个对象
# 与其他编程语言一样，Python从0开始计数，第一个对象为索引位置0
# Python允许从任意两端索引列表
# 列表支持中括号记法中指定开始，结束和步长值，可提供列表的切片
# 如果想存储的数据有明确结构，则需要考虑列表外的其他数据结构
# 本章学习至89页
